<?php

/**
 *  Роутер запросов. Парсит запрос, сравнивает его с шаблоном, вытаскивает Action, передает их назад.
 */
class Router {
        // Хранит конфигурацию маршрутов.
   private $routes = array();
	// Заготовленные шаблоны для регулярок
//	private $constroutes = array('%num%', '%text%');
//	// Их регулярки
//	private $constregexps = array('\d+','\w+');
 
   private $current_action;
    public function __construct(){
		$this->loadRoutes();
    }
	
	// Получаем конфигурацию путей из файла.
    private function loadRoutes() {
        $fp = fopen(DIR_APPCONFIG . 'routes.cfg', 'r');
        $strc = 0;
        while (!feof($fp)) {
            $str = fgets($fp);

            $strc++;
            if ($str[0] != "#" && trim($str) != "") {
                $parts = explode('|', $str);

                    $regroutes = explode(',', trim($parts[0]));
                    $newroute = trim($parts[1]);
                    foreach ($regroutes as $pattern) {
                        $this->routes[(trim($pattern) == '%root%'?'':trim(strtolower($pattern)))] = trim($newroute);
                    }
            }
        }
        fclose($fp);
    }

    // Перезагрузка путей
    public function reloadroutes() {
        $this->loadroutes();
    }
	    
    // Функция парсит запросы
    public function getAction($query) {
        $query = trim(strtolower($query), '/');
        
        //глубина сравнения текущего route с шаблонами из routes.cfg
        //например поиск подходящего шаблона заканчивается тогда, когда нашли $depth одинаковых аргумента 
        //в шаблоне. Например $route = 'index/smthpage/lol' будет подходить под шаблон 'index/smthpage' по глубине 2
        //а lol передастся  в контроллер как аргумент, на этом поиск подходящего шаблона закончится
        $depth = 5;
        //найденные подходящие значения шаблонов буду сохраняться сюда, по умаолчнию error
        $current_route = '';
        //найденые подходящие аргументы
        $current_args= array();
        $max_priority = 0;
        $args = array();
        foreach ($this->routes as $pattern => $route) {
           $args = explode('/', $query);
           $needle = array();
           for ($i = 0; $i < count(explode('/', $pattern)); $i++) {
               $needle[] = array_shift($args);
            }
            //echo trim(implode('/', $needle), '/').' сравниваем с '.$pattern.'<br>';
            if (trim(implode('/', $needle), '/') == $pattern) {
                //echo trim(implode('/', $needle), '/').' найдено совпадение с '.$pattern.'<br>';
                $priority = count(explode('/', $pattern));
                if($priority>$max_priority) 
                {
                    $max_priority = $priority;
                    $current_route = $route;
                    $current_args = $args;
                    //echo"текущим рутом выбран ".$route."<br>";
                    //echo"Аргументы<br>";
                    //var_dump($current_args);
                    //echo"<br>";
                    if($priority == $depth) break;
                }
            }
        }
        
        if(empty($current_route)){
            $current_route = 'Error';
            $current_args = array(404);
        }
        $this->current_action = new Action($current_route, $current_args);
        return $this->current_action;
    }
    public function setCurrentAction($param) {
        $this->current_action = $param;
    }
    public function getCurrentAction()
    {
        return $this->current_action;
    }

}
?>
